package com.cspm.ahjy.bc.office.word.domain;

import org.springframework.util.StringUtils;


/**
 * 对文档的操作（动作）记录（这个系统可识别的原子操作）
 * 比如一条动作名为：将文档上边距设置为2厘米
 * @author ServerZhang
 * @date 2017年10月9日
 */
public class MSAction {
	
	private String actionPre = null;//操作的前缀，仅在Action被统一装饰后才会赋值 
	
	/**
	 * 判断此操作是否是新插入，默认为false
	 */
	private Boolean insert = Boolean.FALSE;
	
	/**
	 * 操作的段落：
	 * 默认null为非段落操作；
	 * 0为标题；
	 * 正自然数为真实段落号；
	 * length＝0为除标题外的所有正文操作
	 */
	private Integer[] paragraphNos = null;
	/**
	 * 操作的文本内容：
	 * 默认null为非文字操作；
	 * “”为指定段落的所有文字
	 */
	private String text = null;
	/**
	 * 标注第几个指定的文字：
	 * 默认null为非文字操作；
	 * null、length＝0为所有匹配的文字（前提是指定了文本）；
	 * 正自然数为需要操作文字的位置，如第1、2个名为“软件工程”的文字
	 */
	private Integer[] textNos = null;
	/**
	 * 操作的类型，比如：
	 * 上边距为“body_top”、
	 * 页面上边框颜色为“body_topBorder_color”、
	 * 字体加粗为“font_bold”
	 */
	//private String type = null;
	/**
	 * 操作类型的描述
	 */
	//private String typeContent = "";
	/**
	 * 操作类型对应的属性值，其类型对应MS对象对应的属性类型
	 */
	//private Object typeValue = null;
	
	/**
	 * 操作类型，包含type、typeContent、typeValue
	 */
	private MSActionType msActionType = null;
	
	/**
	 * 操作是否是表格操作，如果是则保存值
	 */
	private MSTableAction msTableAction = null;
	
	
	public Boolean equals(MSAction action){
		if (action == null) {
			return Boolean.FALSE;
		}
		
		MSTableAction tableAction = action.getMsTableAction();
		if (this.msTableAction != null) {
			return this.msTableAction.equals(tableAction);
		}
		
		Boolean insert2 = action.getInsert();
		if (!this.insert.equals(insert2)) {
			return Boolean.FALSE;
		}
		
		Integer[] paragraphNos2 = action.getParagraphNos();
		if (this.paragraphNos != null && paragraphNos2 != null) {
			int length1 = this.paragraphNos.length;
			int length2 = paragraphNos2.length;
			if (length1 != length2) {
				return Boolean.FALSE;
			}
			for(int i=0; i<length1; i++){
				if (!this.paragraphNos[i].equals(paragraphNos2[i])) {
					return Boolean.FALSE;
				}
			}
		}else if (StringUtils.isEmpty(this.paragraphNos) && StringUtils.isEmpty(paragraphNos2)) {
			
		}else {
			return Boolean.FALSE;
		}
		
		String text2 = action.getText();
		if (this.text != null && text2 != null) {
			if (!this.text.equals(text2)) {
				return Boolean.FALSE;
			}
		}else if (StringUtils.isEmpty(this.text) && StringUtils.isEmpty(text2)) {
			
		}else {
			return Boolean.FALSE;
		}
		
		Integer[] textNos2 = action.getTextNos();
		if (this.textNos != null && textNos2 != null) {
			int length1 = this.textNos.length;
			int length2 = textNos2.length;
			if (length1 != length2) {
				return Boolean.FALSE;
			}
			for(int i=0; i<length1; i++){
				if (!this.textNos[i].equals(textNos2[i])) {
					return Boolean.FALSE;
				}
			}
		}else if (StringUtils.isEmpty(this.textNos) && StringUtils.isEmpty(textNos2)) {
			
		}else {
			return Boolean.FALSE;
		}
		
		MSActionType actionType = action.getMsActionType();
		/*if (actionType == null) {
			return Boolean.FALSE;
		}*/
		
		if (this.msActionType.equals(actionType)) {
			return Boolean.TRUE;
		}
		return Boolean.FALSE;
	}
	
	
	public String getActionPre() {
		return actionPre;
	}


	public void setActionPre(String actionPre) {
		this.actionPre = actionPre;
	}


	public MSActionType getMsActionType() {
		return msActionType;
	}


	public void setMsActionType(MSActionType msActionType) {
		this.msActionType = msActionType;
	}


	public MSTableAction getMsTableAction() {
		return msTableAction;
	}


	public void setMsTableAction(MSTableAction msTableAction) {
		this.msTableAction = msTableAction;
	}


	public Boolean getInsert() {
		return insert;
	}
	public void setInsert(Boolean insert) {
		this.insert = insert;
	}
	public Integer[] getParagraphNos() {
		return paragraphNos;
	}
	public void setParagraphNos(Integer[] paragraphNos) {
		this.paragraphNos = paragraphNos;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public Integer[] getTextNos() {
		return textNos;
	}
	public void setTextNos(Integer[] textNos) {
		this.textNos = textNos;
	}

}
